class HuMen:

    def __init__(self, name, age):
        print('humen init 2')
        self.name = name
        self.age = age

    def show(self):
        print('name:%s,age:%s' % (self.name, self.age))



'''
继承，子类继承父类
'''
class Student(HuMen):
    def __init__(self, name, age, classroom, address):
        super().__init__(name, age)  # 调用父类的构造方法
        print('student init 2')
        '''
           Python 的类中成员变量可以设置为私有（private）,
           没有private 关键字，但可以通过命名约定来实现类似的功能。
        '''
        # 私有变量
        self.__classroom = classroom
        self.__address = address

    def getClassroom(self):
        return self.__classroom

    def getAddress(self):
        return self.__address

    def print_age(self):
        print('%s: %s' % (self.name, self.age))
        # 调用私有方法
        self.__private_func()

    '''
        python 中的方法都是public的。
        如果想让方法只在类内部使用，可以用__开头，
        这样外部就无法调用该方法。
    '''
    def __private_func(self):
        print('私有方法，只能在类内部调用')

    # 重写父类的方法
    def show(self):
        # 调用父类的方法
        super().show()
        print('name:%s,age:%s,classroom:%s,address:%s' % (self.name, self.age, self.__classroom, self.__address))


# 主函数
if __name__ == "__main__":
    stu = Student('yejing', 35, '101', '北京')
    stu.show()
    print(stu.getAddress())
    print(stu.getClassroom())

    # 调用私有方法
    # stu.__private_func() # 报错 AttributeError: 'Student' object has no attribute '__private_func'

    stu.print_age()

    # 分割线
    print('-' * 20)

    # 调用父类的方法
    stu.show()

    # 分割线
    print('-' * 20)

    # hm2 = HuMen('yejing', 22)
    # hm2.show()
